Программирование сетевых приложений

Основные принципы, методы и перспективы разработки объектно-ориентированных программ и сетевых приложений

Программирование сетевых приложений

Содержание лекции

  • Предмет курса и содержание учебной дисциплины
  • Связь с другими учебными дисциплинами
  • Две парадигмы программирования
  • Основные направления в программировании
  • Возникновение объектно-ориентированного программирования (ООП)
  • Базовые принципы ООП
  • Реализация основных концепций ООП
  • Технология разработки программ на основе ООП
Принципы методы и перспективы ООП
Программирование сетевых приложений

Предмет курса и содержание учебной дисциплины

Программирование сетевых приложений - это комплексная дисциплина, охватывающая:

  • Основы объектно-ориентированного программирования
  • Принципы проектирования сетевых приложений
  • Использование языка C++ и фреймворка Qt6
  • Разработка клиент-серверных приложений
  • Сетевые протоколы и взаимодействие
  • Многопоточность и асинхронное программирование
Принципы методы и перспективы ООП
Программирование сетевых приложений

Связь с другими учебными дисциплинами

  • Алгоритмы и структуры данных - основы эффективного программирования
  • Операционные системы - понимание процессов и потоков
  • Компьютерные сети - знание протоколов и архитектуры сетей
  • Базы данных - работа с данными в сетевых приложениях
  • Программная инженерия - методологии разработки
  • Информационная безопасность - защита сетевых приложений
Принципы методы и перспективы ООП
Программирование сетевых приложений

Две парадигмы программирования

Императивная парадигма

  • Описывает как решать задачу
  • Последовательность команд изменяющих состояние
  • Примеры: C, Pascal, Python

Декларативная парадигма

  • Описывает что нужно решить
  • Определение свойств и отношений
  • Примеры: SQL, Haskell, Prolog
Принципы методы и перспективы ООП
Программирование сетевых приложений

Основные направления в программировании

  • Структурное программирование - разделение на функции/процедуры
  • Модульное программирование - разделение на независимые модули
  • Объектно-ориентированное программирование - разделение на объекты
  • Функциональное программирование - вычисление функций
  • Логическое программирование - описание логических отношений
  • Аспектно-ориентированное программирование - разделение по аспектам
Принципы методы и перспективы ООП
Программирование сетевых приложений

Возникновение объектно-ориентированного программирования

Исторический контекст

  • 1960-е годы: язык Simula - первые концепции ООП
  • 1970-е годы: Smalltalk - развитие идеи объектов
  • 1980-е годы: C++ - практическая реализация
  • 1990-е годы: Java - массовое распространение ООП

Причины появления

  • Сложность управления большими программами
  • Необходимость повторного использования кода
  • Естественное моделирование реального мира
Принципы методы и перспективы ООП
Программирование сетевых приложений

Базовые принципы ООП

1. Инкапсуляция

  • Сокрытие внутренней реализации
  • Предоставление интерфейса для взаимодействия

2. Наследование

  • Создание новых классов на основе существующих
  • Повторное использование кода

3. Полиморфизм

  • Возможность использовать объекты разных типов единым образом
  • Гибкость и расширяемость системы
Принципы методы и перспективы ООП
Программирование сетевых приложений

Инкапсуляция в C++

class NetworkConnection {
private:
    string ip_address;
    int port;
    bool connected;
    
public:
    void connect(const string& ip, int p) {
        ip_address = ip;
        port = p;
        connected = true;
    }
    
    void disconnect() {
        connected = false;
    }
    
    bool isConnected() const {
        return connected;
    }
};
Принципы методы и перспективы ООП
Программирование сетевых приложений

Наследование в C++

class NetworkDevice {
protected:
    string mac_address;
    string ip_address;
    
public:
    void setMacAddress(const string& mac) {
        mac_address = mac;
    }
    
    void setIpAddress(const string& ip) {
        ip_address = ip;
    }
    
    string getMacAddress() const {
        return mac_address;
    }
    
    string getIpAddress() const {
        return ip_address;
    }
};

class Router : public NetworkDevice {
private:
    int routing_table_size;
    
public:
    void setRoutingTableSize(int size) {
        routing_table_size = size;
    }
    
    int getRoutingTableSize() const {
        return routing_table_size;
    }
    
    void configurePort(int port, const string& ip) {
        setIpAddress(ip);  // Используем методы базового класса
        // Дополнительная логика настройки порта
    }
};
Принципы методы и перспективы ООП
Программирование сетевых приложений

Полиморфизм в C++

class NetworkProtocol {
public:
    virtual void transmit(const string& data) = 0;
    virtual ~NetworkProtocol() = default;
};

class TCPProtocol : public NetworkProtocol {
public:
    void transmit(const string& data) override {
        cout << "TCP transmission: " << data << endl;
    }
};

class UDPProtocol : public NetworkProtocol {
public:
    void transmit(const string& data) override {
        cout << "UDP transmission: " << data << endl;
    }
};
Принципы методы и перспективы ООП
Программирование сетевых приложений

Реализация полиморфизма

void sendNetworkData(NetworkProtocol* protocol, const string& data) {
    protocol->transmit(data);  // Полиморфный вызов
}

int main() {
    TCPProtocol tcp;
    UDPProtocol udp;
    
    sendNetworkData(&tcp, "Hello via TCP");
    sendNetworkData(&udp, "Hello via UDP");
    
    return 0;
}
Принципы методы и перспективы ООП
Программирование сетевых приложений

Реализация ООП в различных языках программирования

Сравнение синтаксиса: инкапсуляция

Характеристика C++ Java Python
Модификаторы доступа public, protected, private public, protected, private _protected, __private (конвенция)
Геттеры/сеттеры Ручные или Q_PROPERTY (Qt) Ручные или Lombok @Getter @property декоратор
Инкапсуляция на уровне класса Да Да (package-private) На уровне модуля
Принципы методы и перспективы ООП
Программирование сетевых приложений

Сравнение синтаксиса: наследование

// C++
class TCPProtocol : public NetworkProtocol {
public:
    void transmit(const string& data) override { /* ... */ }
};
// Java
public class TCPProtocol extends NetworkProtocol {
    @Override
    public void transmit(String data) { /* ... */ }
}
# Python
class TCPProtocol(NetworkProtocol):
    def transmit(self, data: str) -> None:
        ...
Принципы методы и перспективы ООП
Программирование сетевых приложений

Сравнение: интерфейсы

// C++ (чисто виртуальный класс)
class INetworkService {
public:
    virtual void start() = 0;
    virtual void stop() = 0;
    virtual ~INetworkService() = default;
};
// Java (ключевое слово interface)
public interface INetworkService {
    void start();
    void stop();
}
# Python (abc модуль)
from abc import ABC, abstractmethod

class INetworkService(ABC):
    @abstractmethod
    def start(self) -> None: ...
    @abstractmethod
    def stop(self) -> None: ...
Принципы методы и перспективы ООП
Программирование сетевых приложений

Преимущества ООП в сетевом программировании

  • Модульность - легкая замена компонентов
  • Повторное использование - готовые классы для типовых задач
  • Расширяемость - простое добавление новых функций
  • Поддержка - локализация изменений
  • Абстракция - скрытие сложности сетевого взаимодействия
Принципы методы и перспективы ООП
Программирование сетевых приложений

Перспективы развития

Современные тенденции

  • Микросервисная архитектура
  • Облачные вычисления
  • Интернет вещей (IoT)
  • Блокчейн технологии
  • 5G и новые протоколы

Будущее ООП

  • Гибридные парадигмы
  • Аспектно-ориентированное программирование
  • Функциональное программирование в ООП языках
Принципы методы и перспективы ООП
Программирование сетевых приложений

Примеры ООП в реальных сетевых приложениях

Qt Framework (C++)

  • Иерархия QObject → QWidget → QPushButton
  • Сигналы/слоты как механизм взаимодействия
  • Модель/Представление/Делегат

Java Spring (Java)

  • Аннотации (@Controller, @Service)
  • Внедрение зависимостей (IoC)
  • REST-контроллеры

Twisted / asyncio (Python)

  • Протоколы как классы
  • Фабрики соединений
  • Декораторы как аспекты
Принципы методы и перспективы ООП
Программирование сетевых приложений

Заключение

Объектно-ориентированное программирование остается ключевой парадигмой для разработки сетевых приложений благодаря:

  • Естественному моделированию реальных сущностей
  • Гибкости и расширяемости
  • Поддержке сложных систем
  • Богатой экосистеме инструментов и фреймворков

Qt6 и C++ предоставляют мощные инструменты для создания эффективных и масштабируемых сетевых приложений.

Принципы методы и перспективы ООП
Программирование сетевых приложений

Вопросы для самопроверки

  1. Какие три основных принципа ООП вы знаете?
  2. Чем отличается императивная парадигма от декларативной?
  3. Как реализуется полиморфизм в C++?
  4. Какие преимущества дает использование ООП в сетевом программировании?
  5. Какие современные технологии используют принципы ООП?
  6. Чем отличается реализация интерфейсов в C++, Java и Python?
  7. В чём разница между инкапсуляцией в C++ (модификаторы доступа) и Python (конвенции именования)?
Принципы методы и перспективы ООП

Заметки докладчика: - Это вводная лекция курса. Цель — дать общее представление об ООП и его роли в сетевом программировании. - Уделить больше внимание практической составляющей курса: C++ и Qt6. - Можно упомянуть, что в рамках курса студенты создадут полноценное клиент-серверное приложение (курсовой проект). - Рекомендуется спросить студентов, с какими языками программирования они уже знакомы, чтобы адаптировать примеры.

Заметки докладчика: - Акцентировать внимание: основной инструмент курса — C++ с фреймворком Qt6. - Упомянуть, что Qt — кроссплатформенный фреймворк, широко используемый в промышленности. - Курсовой проект будет заключаться в разработке клиент-серверного приложения на Qt. - Для китайской программы: темы 1-8 перезачтены, акцент на темах 9-11 (сетевое взаимодействие, GUI, распределённая обработка).

Заметки докладчика: - Объяснить разницу на простом примере: императивный — «отсортировать массив пузырьком» (шаг за шагом), декларативный — «выбрать все записи где возраст > 18» (SQL). - Упомянуть, что C++ поддерживает несколько парадигм: императивную, ООП, обобщённое программирование (шаблоны) и частично функциональную (лямбды). - QML (часть Qt) — это декларативный язык для описания UI.

Заметки докладчика: - Инкапсуляция: подчеркнуть, что это не просто «private», а проектирование API класса. Аналогия — пульт управления телевизором: кнопки (интерфейс), внутренняя схема скрыта. - Наследование: предупредить о проблеме «божественного объекта» и глубокой иерархии. Правило: наследование — это отношение «IS-A» (является). - Полиморфизм: один из самых важных принципов для сетевого программирования — позволяет писать универсальный код для разных протоколов. - В C++ полиморфизм реализуется через virtual-функции (динамический) и шаблоны/перегрузку (статический).

Заметки докладчика: - Обратить внимание на модификаторы доступа: private (скрыто), public (доступно извне). - Упомянуть, что в реальном коде стоит добавлять валидацию в сеттеры (проверка IP-адреса, диапазон портов). - В Qt принято использовать Q_PROPERTY для инкапсуляции (будет рассмотрено в лекции 12). - Отметить метод isConnected() с модификатором const — он не изменяет состояние объекта.

Заметки докладчика: - Ключевое слово public перед NetworkDevice означает public-наследование (отношение «является»). - Router имеет доступ к protected-членам базового класса (mac_address, ip_address). - Метод configurePort() демонстрирует вызов методов базового класса из производного. - В Qt наследование от QObject — основа для использования сигналов/слотов и метасистемы.

Заметки докладчика: - = 0 обозначает чисто виртуальную функцию — класс NetworkProtocol становится абстрактным. - virtual ~NetworkProtocol() = default — виртуальный деструктор ОБЯЗАТЕЛЕН для базовых классов с виртуальными функциями. Без него при удалении через указатель на базовый класс будет UB. - Ключевое слово override (C++11) позволяет компилятору проверить правильность переопределения. - В Qt аналогом являются классы с Q_OBJECT и виртуальные методы в иерархии.

Заметки докладчика: - Функция sendNetworkData принимает указатель на базовый класс, но вызывается метод конкретного производного класса — это и есть динамический полиморфизм. - Механизм: vtable (таблица виртуальных функций) и vptr (указатель на vtable в каждом объекте). - На практике в сетевом программировании это позволяет единообразно работать с разными протоколами (TCP, UDP, WebSocket и т.д.). - В современном C++ предпочтительнее использовать unique_ptr<NetworkProtocol> вместо сырых указателей.

Заметки докладчика: - Программа требует ознакомления с реализациями ООП в разных языках. - C++: максимальный контроль (ручное управление памятью, множественное наследование). - Java: строгая ООП (всё — класс, интерфейсы как отдельная конструкция, сборщик мусора). - Python: динамическая типизация, «питонийский» подход (конвенции вместо принуждения). - Для данного курса мы используем C++ — он даёт наибольший контроль над ресурсами, что критично для сетевого программирования.

Заметки докладчика: - Qt — пример масштабного применения ООП для кроссплатформенных сетевых приложений. - Java Spring — самый популярный фреймворк для серверных приложений (микросервисы). - Python asyncio — современный подход к асинхронному сетевому программированию. - Все три примера используют принципы ООП: инкапсуляцию, наследование, полиморфизм.

Заметки докладчика: Ожидаемые ответы: 1. Инкапсуляция, наследование, полиморфизм (иногда выделяют также абстракцию). 2. Императивная описывает «как» (последовательность команд), декларативная — «что» (свойства результата). 3. Через виртуальные функции (vtable/vptr) — динамический полиморфизм; через перегрузку и шаблоны — статический. 4. Модульность, повторное использование, расширяемость (легко добавить новый протокол), абстракция сложности. 5. Микросервисы (Java Spring, C++ gRPC), облачные платформы, игровые движки (Unreal Engine — C++), мобильные приложения (Qt). 6. C++: чисто виртуальный класс (= 0). Java: ключевое слово interface (отдельная конструкция, множественное наследование интерфейсов). Python: abc.ABC с @abstractmethod. 7. C++: компилятор принудительно проверяет private/protected/public. Python: _protected и __private — только конвенция, runtime не запрещает доступ (атрибут __name подменяется на _ClassName__name).